include $(top_srcdir)/build/Makefile.am.common

SUBDIRS=pdiff .

# Here are all the tests that are run unconditionally
TESTS +=						\
a1-image-sample$(EXEEXT)				\
a1-mask$(EXEEXT)					\
a1-traps-sample$(EXEEXT)				\
a8-mask$(EXEEXT)					\
alpha-similar$(EXEEXT)					\
big-line$(EXEEXT)					\
big-trap$(EXEEXT)					\
bilevel-image$(EXEEXT)					\
caps-joins$(EXEEXT)					\
caps-joins-alpha$(EXEEXT)				\
caps-sub-paths$(EXEEXT)					\
clip-all$(EXEEXT)					\
clip-empty$(EXEEXT)					\
clip-fill-rule$(EXEEXT)					\
clip-fill-rule-pixel-aligned$(EXEEXT)			\
clip-nesting$(EXEEXT)					\
clip-operator$(EXEEXT)					\
clip-push-group$(EXEEXT)				\
clip-twice$(EXEEXT)					\
clip-zero$(EXEEXT)					\
clipped-group$(EXEEXT)					\
clipped-surface$(EXEEXT)				\
close-path$(EXEEXT)					\
composite-integer-translate-source$(EXEEXT)		\
composite-integer-translate-over$(EXEEXT)		\
composite-integer-translate-over-repeat$(EXEEXT)	\
copy-path$(EXEEXT)					\
create-for-stream$(EXEEXT)				\
create-from-png$(EXEEXT)				\
create-from-png-stream$(EXEEXT)				\
dash-caps-joins$(EXEEXT)				\
dash-curve$(EXEEXT)					\
dash-no-dash$(EXEEXT)					\
dash-offset-negative$(EXEEXT)				\
dash-scale$(EXEEXT)					\
dash-state$(EXEEXT)					\
dash-zero-length$(EXEEXT)				\
degenerate-arc$(EXEEXT)					\
degenerate-dash$(EXEEXT)				\
degenerate-path$(EXEEXT)				\
degenerate-pen$(EXEEXT)					\
device-offset$(EXEEXT)					\
device-offset-fractional$(EXEEXT)			\
device-offset-positive$(EXEEXT)				\
device-offset-scale$(EXEEXT)				\
extend-pad$(EXEEXT)					\
extend-reflect$(EXEEXT)					\
extend-reflect-similar$(EXEEXT)				\
extend-repeat$(EXEEXT)					\
extend-repeat-similar$(EXEEXT)				\
fill-alpha$(EXEEXT)					\
fill-alpha-pattern$(EXEEXT)				\
fill-and-stroke$(EXEEXT)				\
fill-and-stroke-alpha$(EXEEXT)				\
fill-and-stroke-alpha-add$(EXEEXT)			\
fill-degenerate-sort-order$(EXEEXT)			\
fill-missed-stop$(EXEEXT)				\
fill-rule$(EXEEXT)					\
filter-bilinear-extents$(EXEEXT)			\
filter-nearest-offset$(EXEEXT)				\
filter-nearest-transformed$(EXEEXT)			\
finer-grained-fallbacks$(EXEEXT)			\
font-face-get-type$(EXEEXT)				\
font-matrix-translation$(EXEEXT)			\
font-options$(EXEEXT)					\
glyph-cache-pressure$(EXEEXT)				\
get-and-set$(EXEEXT)					\
get-clip$(EXEEXT)					\
get-group-target$(EXEEXT)				\
get-path-extents$(EXEEXT)				\
gradient-alpha$(EXEEXT)					\
gradient-constant-alpha$(EXEEXT)			\
gradient-zero-stops$(EXEEXT)				\
group-paint$(EXEEXT)					\
huge-pattern$(EXEEXT)					\
image-surface-source$(EXEEXT)				\
infinite-join$(EXEEXT)					\
in-fill-empty-trapezoid$(EXEEXT)			\
in-fill-trapezoid$(EXEEXT)				\
invalid-matrix$(EXEEXT)					\
large-clip$(EXEEXT)					\
large-font$(EXEEXT)					\
large-source$(EXEEXT)					\
leaky-dash$(EXEEXT)					\
leaky-dashed-rectangle$(EXEEXT)				\
leaky-dashed-stroke$(EXEEXT)				\
leaky-polygon$(EXEEXT)					\
line-width$(EXEEXT)					\
line-width-scale$(EXEEXT)				\
line-width-zero$(EXEEXT)				\
linear-gradient$(EXEEXT)				\
linear-gradient-reflect$(EXEEXT)			\
long-dashed-lines$(EXEEXT)				\
long-lines$(EXEEXT)					\
mask$(EXEEXT)						\
mask-alpha$(EXEEXT)					\
mask-ctm$(EXEEXT)					\
mask-surface-ctm$(EXEEXT)				\
mask-transformed-image$(EXEEXT)				\
mask-transformed-similar$(EXEEXT)			\
meta-surface-pattern$(EXEEXT)				\
miter-precision$(EXEEXT)				\
move-to-show-surface$(EXEEXT)				\
new-sub-path$(EXEEXT)					\
nil-surface$(EXEEXT)					\
operator$(EXEEXT)					\
operator-alpha$(EXEEXT)					\
operator-clear$(EXEEXT)					\
operator-source$(EXEEXT)				\
over-above-source$(EXEEXT)				\
over-around-source$(EXEEXT)				\
over-below-source$(EXEEXT)				\
over-between-source$(EXEEXT)				\
paint$(EXEEXT)						\
paint-repeat$(EXEEXT)					\
paint-source-alpha$(EXEEXT)				\
paint-with-alpha$(EXEEXT)				\
pass-through$(EXEEXT)					\
pattern-get-type$(EXEEXT)				\
pattern-getters$(EXEEXT)				\
pixman-rotate$(EXEEXT)					\
png$(EXEEXT)						\
push-group$(EXEEXT)					\
radial-gradient$(EXEEXT)				\
random-intersections$(EXEEXT)				\
rectangle-rounding-error$(EXEEXT)			\
rectilinear-fill$(EXEEXT)				\
rectilinear-miter-limit$(EXEEXT)			\
rectilinear-stroke$(EXEEXT)				\
reflected-stroke$(EXEEXT)				\
rel-path$(EXEEXT)					\
rgb24-ignore-alpha$(EXEEXT)				\
rotate-image-surface-paint$(EXEEXT)			\
scale-down-source-surface-paint$(EXEEXT)		\
scale-source-surface-paint$(EXEEXT)			\
stroke-ctm-caps$(EXEEXT)				\
stroke-image$(EXEEXT)				        \
select-font-face$(EXEEXT)				\
select-font-no-show-text$(EXEEXT)			\
self-copy$(EXEEXT)					\
self-copy-overlap$(EXEEXT)				\
self-intersecting$(EXEEXT)				\
set-source$(EXEEXT)					\
show-glyphs-many$(EXEEXT)				\
show-text-current-point$(EXEEXT)			\
skew-extreme$(EXEEXT)					\
smask$(EXEEXT)						\
smask-fill$(EXEEXT)					\
smask-image-mask$(EXEEXT)				\
smask-mask$(EXEEXT)					\
smask-paint$(EXEEXT)					\
smask-stroke$(EXEEXT)					\
smask-text$(EXEEXT)					\
solid-pattern-cache-stress$(EXEEXT)			\
source-clip$(EXEEXT)					\
source-clip-scale$(EXEEXT)				\
source-surface-scale-paint$(EXEEXT)			\
spline-decomposition$(EXEEXT)				\
surface-finish-twice$(EXEEXT)				\
surface-pattern$(EXEEXT)				\
surface-pattern-big-scale-down$(EXEEXT)			\
surface-pattern-scale-down$(EXEEXT)			\
surface-pattern-scale-up$(EXEEXT)			\
text-antialias-gray$(EXEEXT)				\
text-antialias-none$(EXEEXT)				\
text-antialias-subpixel$(EXEEXT)			\
text-cache-crash$(EXEEXT)				\
text-pattern$(EXEEXT)					\
text-rotate$(EXEEXT)					\
text-transform$(EXEEXT)					\
text-zero-len$(EXEEXT)					\
toy-font-face$(EXEEXT)					\
transforms$(EXEEXT)					\
translate-show-surface$(EXEEXT)				\
trap-clip$(EXEEXT)					\
truetype-tables$(EXEEXT)				\
unantialiased-shapes$(EXEEXT)				\
unbounded-operator$(EXEEXT)				\
user-data$(EXEEXT)					\
user-font$(EXEEXT)					\
user-font-mask$(EXEEXT)					\
user-font-proxy$(EXEEXT)				\
user-font-rescale$(EXEEXT)				\
zero-alpha$(EXEEXT)

# XXX: Here are some existing tests that are currently disabled for
# one reason or another. They can still be built and run (manually)
# but we don't currently run them as part of 'make check' to avoid
# inflicting some particularly nasty problems on the user of the test
# suite (described below).
#
# It would definitely be worthwhile to address these problems so that
# these tests can get back into the test suite proper, (since the
# problems do indicated bugs somewhere and we're less likely to get
# those bugs fixed without the attention due to having these tests in
# the suite).
#
# The reasons for disabling the tests are as follows:
#
# extend-reflect - Triggers an infinite (or near-infinite) bug in some
#	X servers in some circumstances. Details and cause unknown.
#
# text-glyph-range - This test triggers the following assertion in cairo:
#
#	lt-text-glyph-range: cairo-scaled-font-subsets.c:350:
#	_cairo_sub_font_collect: Assertion `collection->num_glyphs ==
#	collection->max_glyph + 1' failed.
#
#	And as a result causes a failure to be recorded by the test
#	suite, (in spite of the XFAIL status of the test). So maybe
#	that's just a bug in the test rig that should just consider
#	the abort an XFAIL like any other.
DISABLED_TESTS =			\
text-glyph-range$(EXEEXT)

# Then we have a collection of tests that are only run if certain
# features are compiled into cairo
if HAVE_PTHREAD
TESTS += pthread-show-text$(EXEEXT)
endif

if CAIRO_HAS_FT_FONT
TESTS += bitmap-font$(EXEEXT)
TESTS += ft-font-create-for-ft-face$(EXEEXT)
TESTS += ft-show-glyphs-positioning$(EXEEXT)
TESTS += ft-show-glyphs-table$(EXEEXT)
TESTS += ft-text-vertical-layout-type1$(EXEEXT)
TESTS += ft-text-vertical-layout-type3$(EXEEXT)
TESTS += ft-text-antialias-none$(EXEEXT)
endif

# Need to add win32-surface-source, quartz-surface-source
if CAIRO_HAS_GLITZ_SURFACE
TESTS += glitz-surface-source$(EXEEXT)
endif

if CAIRO_HAS_PDF_SURFACE
TESTS += pdf-features$(EXEEXT)
TESTS += pdf-surface-source$(EXEEXT)
endif

if CAIRO_HAS_PS_SURFACE
TESTS += ps-features$(EXEEXT)
TESTS += ps-surface-source$(EXEEXT)
endif

if CAIRO_HAS_SVG_SURFACE
TESTS += svg-surface$(EXEEXT)
TESTS += svg-clip$(EXEEXT)
TESTS += svg-surface-source$(EXEEXT)
endif

if CAIRO_HAS_XLIB_SURFACE
TESTS += xlib-expose-event$(EXEEXT)
TESTS += xlib-surface$(EXEEXT)
TESTS += xlib-surface-source$(EXEEXT)
endif

if CAIRO_HAS_XLIB_XRENDER_SURFACE
TESTS += get-xrender-format$(EXEEXT)
endif

if CAIRO_HAS_MULTI_PAGE_SURFACES
TESTS += multi-page$(EXEEXT)
endif

# Include fallback-resolution (once!) if we have any of the vector surfaces
if CAIRO_HAS_SVG_SURFACE
test = fallback-resolution$(EXEEXT)
endif
if CAIRO_HAS_PDF_SURFACE
test = fallback-resolution$(EXEEXT)
endif
if CAIRO_HAS_PS_SURFACE
test = fallback-resolution$(EXEEXT)
endif
TESTS += $(test)

# All tests which have a reference image go here.
REFERENCE_IMAGES = \
	a1-image-sample-ref.png		\
	a1-mask-ref.png	\
	a1-traps-sample-ref.png		\
	a8-mask-ref.png	\
	alpha-similar-ref.png	\
	alpha-similar-rgb24-ref.png	\
	big-line-ref.png		\
	big-line-rgb24-ref.png		\
	big-line-ps2-ref.png		\
	big-line-ps3-ref.png		\
	big-line-ps2-rgb24-ref.png	\
	big-line-ps3-rgb24-ref.png	\
	big-line-quartz-ref.png		\
	big-line-quartz-rgb24-ref.png	\
	bilevel-image-ref.png		\
	bitmap-font-ref.png	\
	bitmap-font-rgb24-ref.png	\
	caps-joins-alpha-quartz-ref.png	\
	caps-joins-alpha-ref.png	\
	caps-joins-alpha-svg12-ref.png	\
	caps-joins-alpha-svg11-ref.png	\
	caps-joins-ref.png	\
	caps-joins-ps2-ref.png	\
	caps-joins-ps3-ref.png	\
	caps-sub-paths-ref.png	\
	clip-all-ref.png	\
	clip-empty-ref.png	\
	clip-fill-rule-pixel-aligned-ref.png	\
	clip-fill-rule-pixel-aligned-rgb24-ref.png	\
	clip-fill-rule-ps2-argb32-ref.png	\
	clip-fill-rule-ps3-argb32-ref.png	\
	clip-fill-rule-ps2-rgb24-ref.png		\
	clip-fill-rule-ps3-rgb24-ref.png		\
	clip-fill-rule-ref.png	\
	clip-fill-rule-rgb24-ref.png	\
	clip-nesting-ps2-argb32-ref.png	\
	clip-nesting-ps3-argb32-ref.png	\
	clip-nesting-ps2-rgb24-ref.png	\
	clip-nesting-ps3-rgb24-ref.png	\
	clip-nesting-quartz-ref.png	\
	clip-nesting-quartz-rgb24-ref.png	\
	clip-nesting-ref.png	\
	clip-nesting-rgb24-ref.png	\
	clip-operator-ref.png	\
	clip-operator-pdf-argb32-ref.png \
	clip-operator-pdf-rgb24-ref.png \
	clip-operator-ps2-rgb24-ref.png	\
	clip-operator-ps3-rgb24-ref.png	\
	clip-operator-ps3-ref.png	\
	clip-operator-rgb24-ref.png	\
	clip-operator-quartz-ref.png	\
	clip-operator-quartz-rgb24-ref.png	\
	clip-push-group-ps2-argb32-ref.png	\
	clip-push-group-ps3-argb32-ref.png	\
	clip-push-group-ps2-rgb24-ref.png	\
	clip-push-group-ps3-rgb24-ref.png	\
	clip-push-group-quartz-ref.png	\
	clip-push-group-ref.png	\
	clip-twice-ps2-argb32-ref.png	\
	clip-twice-ps3-argb32-ref.png	\
	clip-twice-ps2-rgb24-ref.png	\
	clip-twice-ps3-rgb24-ref.png	\
	clip-twice-quartz-ref.png	\
	clip-twice-quartz-rgb24-ref.png	\
	clip-twice-ref.png	\
	clip-twice-rgb24-ref.png	\
	clipped-group-ref.png	\
	clipped-group-ps2-ref.png	\
	clipped-group-ps3-ref.png	\
	clipped-surface-ref.png	\
	close-path-ref.png	\
	close-path-ps2-ref.png	\
	close-path-ps3-ref.png	\
	composite-integer-translate-over-ref.png	\
	composite-integer-translate-over-repeat-ref.png	\
	composite-integer-translate-source-ref.png	\
	copy-path-ps2-ref.png	\
	copy-path-ps3-ref.png	\
	copy-path-ref.png	\
	create-from-png-ref.png			\
	create-from-png-alpha-ref.png		\
	create-from-png-gray-ref.png		\
	create-from-png-gray-alpha-ref.png	\
	create-from-png-indexed-ref.png		\
	create-from-png-indexed-alpha-ref.png	\
	create-from-png-stream-ref.png	\
	dash-caps-joins-ps2-argb32-ref.png	\
	dash-caps-joins-ps3-argb32-ref.png	\
	dash-caps-joins-ps2-rgb24-ref.png	\
	dash-caps-joins-ps3-rgb24-ref.png	\
	dash-caps-joins-quartz-ref.png	\
	dash-caps-joins-ref.png	\
	dash-curve-ref.png	\
	dash-curve-ps2-ref.png \
	dash-curve-ps3-ref.png \
	dash-curve-quartz-ref.png \
	dash-no-dash-ref.png	\
	dash-offset-negative-ref.png	\
	dash-scale-ps2-argb32-ref.png	\
	dash-scale-ps3-argb32-ref.png	\
	dash-scale-ps2-rgb24-ref.png	\
	dash-scale-ps3-rgb24-ref.png	\
	dash-scale-quartz-ref.png	\
	dash-scale-ref.png	\
	dash-state-ps2-ref.png	\
	dash-state-ps3-ref.png	\
	dash-state-ref.png	\
	dash-state-quartz-ref.png	\
	dash-zero-length-ps2-ref.png	\
	dash-zero-length-ps3-ref.png	\
	dash-zero-length-ps2-rgb24-ref.png	\
	dash-zero-length-ps3-rgb24-ref.png	\
	dash-zero-length-ref.png	\
	dash-zero-length-rgb24-ref.png	\
	degenerate-arc-ref.png		\
	degenerate-arc-ps2-ref.png	\
	degenerate-arc-ps3-ref.png	\
	degenerate-dash-ref.png		\
	degenerate-pen-ref.png		\
	degenerate-pen-ps2-ref.png	\
	degenerate-pen-ps3-ref.png	\
	degenerate-pen-quartz-ref.png	\
	degenerate-path-ps2-argb32-ref.png	\
	degenerate-path-ps2-rgb24-ref.png	\
	degenerate-path-ps3-argb32-ref.png	\
	degenerate-path-ps3-rgb24-ref.png	\
	degenerate-path-ref.png	\
	degenerate-path-rgb24-ref.png	\
	degenerate-path-quartz-ref.png	\
	degenerate-path-quartz-rgb24-ref.png	\
	device-offset-fractional-ref.png	\
	device-offset-fractional-pdf-ref.png	\
	device-offset-fractional-ps2-ref.png	\
	device-offset-fractional-ps3-ref.png	\
	device-offset-positive-ref.png	\
	device-offset-positive-rgb24-ref.png	\
	device-offset-ref.png	\
	device-offset-rgb24-ref.png	\
	device-offset-scale-ref.png	\
	extend-pad-ref.png	\
	extend-reflect-ref.png	\
	extend-reflect-similar-ref.png	\
	extend-reflect-similar-ps2-ref.png	\
	extend-reflect-similar-ps3-ref.png	\
	extend-reflect-ps2-ref.png \
	extend-reflect-ps3-ref.png \
	extend-repeat-ref.png	\
	extend-repeat-similar-ref.png	\
	fallback-resolution-ppi37.5x37.5-ref.png \
	fallback-resolution-ppi37.5x72-ref.png \
	fallback-resolution-ppi37.5x75-ref.png \
	fallback-resolution-ppi37.5x150-ref.png \
	fallback-resolution-ppi37.5x300-ref.png \
	fallback-resolution-ppi37.5x600-ref.png \
	fallback-resolution-ppi72x37.5-ref.png \
	fallback-resolution-ppi72x72-ref.png \
	fallback-resolution-ppi72x75-ref.png \
	fallback-resolution-ppi72x150-ref.png \
	fallback-resolution-ppi72x300-ref.png \
	fallback-resolution-ppi72x600-ref.png \
	fallback-resolution-ppi75x37.5-ref.png \
	fallback-resolution-ppi75x72-ref.png \
	fallback-resolution-ppi75x75-ref.png \
	fallback-resolution-ppi75x150-ref.png \
	fallback-resolution-ppi75x300-ref.png \
	fallback-resolution-ppi75x600-ref.png \
	fallback-resolution-ppi150x37.5-ref.png \
	fallback-resolution-ppi150x72-ref.png \
	fallback-resolution-ppi150x75-ref.png \
	fallback-resolution-ppi150x150-ref.png \
	fallback-resolution-ppi150x300-ref.png \
	fallback-resolution-ppi150x600-ref.png \
	fallback-resolution-ppi300x37.5-ref.png \
	fallback-resolution-ppi300x72-ref.png \
	fallback-resolution-ppi300x75-ref.png \
	fallback-resolution-ppi300x150-ref.png \
	fallback-resolution-ppi300x300-ref.png \
	fallback-resolution-ppi300x600-ref.png \
	fallback-resolution-ppi600x37.5-ref.png \
	fallback-resolution-ppi600x72-ref.png \
	fallback-resolution-ppi600x75-ref.png \
	fallback-resolution-ppi600x150-ref.png \
	fallback-resolution-ppi600x300-ref.png \
	fallback-resolution-ppi600x600-ref.png \
	fill-alpha-ref.png	\
	fill-alpha-pattern-ref.png	\
	fill-alpha-pattern-pdf-argb32-ref.png	\
	fill-alpha-pattern-pdf-rgb24-ref.png	\
	fill-alpha-pattern-ps3-ref.png	\
	fill-and-stroke-alpha-add-quartz-ref.png	\
	fill-and-stroke-alpha-add-ref.png	\
	fill-and-stroke-alpha-quartz-ref.png	\
	fill-and-stroke-alpha-ref.png	\
	fill-and-stroke-ps2-argb32-ref.png	\
	fill-and-stroke-ps3-argb32-ref.png	\
	fill-and-stroke-ps2-rgb24-ref.png	\
	fill-and-stroke-ps3-rgb24-ref.png	\
	fill-and-stroke-quartz-ref.png	\
	fill-and-stroke-quartz-rgb24-ref.png	\
	fill-and-stroke-ref.png	\
	fill-and-stroke-rgb24-ref.png	\
	fill-degenerate-sort-order-quartz-ref.png	\
	fill-degenerate-sort-order-quartz-rgb24-ref.png	\
	fill-degenerate-sort-order-ref.png	\
	fill-degenerate-sort-order-rgb24-ref.png	\
	fill-missed-stop-ps2-argb32-ref.png	\
	fill-missed-stop-ps3-argb32-ref.png	\
	fill-missed-stop-ps2-rgb24-ref.png	\
	fill-missed-stop-ps3-rgb24-ref.png	\
	fill-missed-stop-ref.png	\
	fill-missed-stop-rgb24-ref.png	\
	fill-rule-ps2-argb32-ref.png	\
	fill-rule-ps3-argb32-ref.png	\
	fill-rule-ps2-rgb24-ref.png \
	fill-rule-ps3-rgb24-ref.png \
	fill-rule-quartz-ref.png	\
	fill-rule-quartz-rgb24-ref.png	\
	fill-rule-ref.png	\
	fill-rule-rgb24-ref.png	\
	filter-bilinear-extents-ref.png \
	filter-bilinear-extents-pdf-ref.png \
	filter-bilinear-extents-ps2-ref.png \
	filter-bilinear-extents-ps3-ref.png \
	filter-nearest-offset-ref.png	\
	filter-nearest-offset-pdf-ref.png	\
	filter-nearest-offset-ps2-ref.png	\
	filter-nearest-offset-ps3-ref.png	\
	filter-nearest-offset-svg11-ref.png	\
	filter-nearest-offset-svg12-ref.png	\
	filter-nearest-transformed-ref.png	\
	filter-nearest-transformed-pdf-ref.png	\
	filter-nearest-transformed-svg11-ref.png	\
	filter-nearest-transformed-svg12-ref.png	\
	finer-grained-fallbacks-ref.png			\
	finer-grained-fallbacks-rgb24-ref.png		\
	finer-grained-fallbacks-ps2-ref.png	\
	finer-grained-fallbacks-ps2-rgb24-ref.png	\
	finer-grained-fallbacks-ps3-ref.png	\
	finer-grained-fallbacks-ps3-rgb24-ref.png	\
	font-matrix-translation-ps2-argb32-ref.png	\
	font-matrix-translation-ps3-argb32-ref.png	\
	font-matrix-translation-ps2-rgb24-ref.png	\
	font-matrix-translation-ps3-rgb24-ref.png	\
	font-matrix-translation-ref.png	\
	font-matrix-translation-svg12-ref.png	\
	font-matrix-translation-svg11-ref.png	\
	font-matrix-translation-quartz-ref.png \
	ft-text-antialias-none-ps2-argb32-ref.png	\
	ft-text-antialias-none-ps3-argb32-ref.png	\
	ft-text-antialias-none-ref.png	\
	ft-show-glyphs-positioning-ref.png		\
	ft-show-glyphs-positioning-pdf-ref.png		\
	ft-show-glyphs-positioning-ps2-ref.png		\
	ft-show-glyphs-positioning-ps3-ref.png		\
	ft-show-glyphs-positioning-svg12-ref.png		\
	ft-show-glyphs-positioning-svg11-ref.png		\
	ft-show-glyphs-table-ref.png			\
	ft-show-glyphs-table-ps2-ref.png			\
	ft-show-glyphs-table-ps3-ref.png			\
	ft-text-vertical-layout-type1-pdf-ref.png	\
	ft-text-vertical-layout-type1-ps2-ref.png	\
	ft-text-vertical-layout-type1-ps3-ref.png	\
	ft-text-vertical-layout-type1-ref.png	\
	ft-text-vertical-layout-type1-svg12-ref.png	\
	ft-text-vertical-layout-type1-svg11-ref.png	\
	ft-text-vertical-layout-type3-pdf-ref.png	\
	ft-text-vertical-layout-type3-ps2-ref.png	\
	ft-text-vertical-layout-type3-ps3-ref.png	\
	ft-text-vertical-layout-type3-ref.png	\
	ft-text-vertical-layout-type3-svg12-ref.png	\
	ft-text-vertical-layout-type3-svg11-ref.png	\
	get-group-target-ref.png	\
	glitz-surface-source-ref.png \
	glyph-cache-pressure-ref.png	\
	glyph-cache-pressure-ps2-ref.png	\
	glyph-cache-pressure-ps3-ref.png	\
	glyph-cache-pressure-quartz-ref.png	\
	gradient-alpha-pdf-argb32-ref.png	\
	gradient-alpha-pdf-rgb24-ref.png	\
	gradient-alpha-ps2-argb32-ref.png	\
	gradient-alpha-ps3-argb32-ref.png	\
	gradient-alpha-ps2-rgb24-ref.png	\
	gradient-alpha-ps3-rgb24-ref.png	\
	gradient-alpha-ref.png	\
	gradient-alpha-rgb24-ref.png	\
	gradient-constant-alpha-pdf-argb32-ref.png	\
	gradient-constant-alpha-pdf-rgb24-ref.png	\
	gradient-constant-alpha-ps3-ref.png		\
	gradient-constant-alpha-ps3-rgb24-ref.png	\
	gradient-constant-alpha-ref.png	\
	gradient-constant-alpha-rgb24-ref.png	\
	gradient-zero-stops-ref.png	\
	gradient-zero-stops-rgb24-ref.png	\
	group-paint-ref.png	\
	huge-pattern-ref.png	\
	huge-pattern-ps3-ref.png	\
	huge-pattern-pdf-ref.png	\
	huge-pattern-pdf-rgb24-ref.png	\
	image-surface-source-ref.png \
	infinite-join-ref.png	\
	infinite-join-ps2-ref.png	\
	infinite-join-ps3-ref.png	\
	large-clip-ref.png	\
	large-font-ref.png	\
	large-source-ref.png	\
	leaky-dash-ps2-argb32-ref.png	\
	leaky-dash-ps3-argb32-ref.png	\
	leaky-dash-ps2-rgb24-ref.png	\
	leaky-dash-ps3-rgb24-ref.png	\
	leaky-dash-quartz-ref.png	\
	leaky-dash-ref.png	\
	leaky-dashed-rectangle-ref.png		\
	leaky-dashed-rectangle-ps2-ref.png	\
	leaky-dashed-rectangle-ps3-ref.png	\
	leaky-dashed-stroke-ref.png		\
	leaky-dashed-stroke-ps2-ref.png		\
	leaky-dashed-stroke-ps3-ref.png		\
	leaky-polygon-ref.png	\
	leaky-polygon-ps2-ref.png	\
	leaky-polygon-ps3-ref.png	\
	linear-gradient-reflect-ref.png	\
	linear-gradient-reflect-pdf-argb32-ref.png	\
	linear-gradient-reflect-pdf-rgb24-ref.png	\
	linear-gradient-reflect-ps3-ref.png	\
	linear-gradient-reflect-quartz-ref.png	\
	linear-gradient-pdf-ref.png	\
	linear-gradient-ps3-ref.png	\
	linear-gradient-quartz-ref.png	\
	linear-gradient-ref.png	\
	linear-gradient-svg12-ref.png	\
	linear-gradient-svg11-ref.png	\
	line-width-ref.png	\
	line-width-scale-ps2-ref.png	\
	line-width-scale-ps3-ref.png	\
	line-width-scale-quartz-ref.png	\
	line-width-scale-ref.png	\
	long-dashed-lines-ref.png	\
	long-dashed-lines-ps2-ref.png	\
	long-dashed-lines-ps3-ref.png	\
	long-dashed-lines-quartz-ref.png	\
	long-lines-ref.png	\
	mask-alpha-ref.png	\
	mask-alpha-svg11-argb32-ref.png	\
	mask-alpha-svg12-argb32-ref.png	\
	mask-alpha-rgb24-ref.png	\
	mask-alpha-quartz-argb32-ref.png \
	mask-ctm-ref.png	\
	mask-ctm-rgb24-ref.png	\
	mask-ctm-svg11-argb32-ref.png	\
	mask-ctm-svg12-argb32-ref.png	\
	mask-ref.png	\
	mask-rgb24-ref.png	\
	mask-pdf-argb32-ref.png	\
	mask-pdf-rgb24-ref.png	\
	mask-quartz-ref.png	\
	mask-quartz-rgb24-ref.png	\
	mask-surface-ctm-ref.png	\
	mask-surface-ctm-rgb24-ref.png	\
	mask-surface-ctm-svg11-argb32-ref.png	\
	mask-surface-ctm-svg12-argb32-ref.png	\
	mask-svg11-rgb24-ref.png	\
	mask-svg11-argb32-ref.png	\
	mask-svg12-rgb24-ref.png	\
	mask-svg12-argb32-ref.png	\
	mask-transformed-image-ref.png	\
	mask-transformed-similar-ref.png	\
	mask-transformed-similar-pdf-ref.png	\
	mask-transformed-similar-svg12-ref.png	\
	mask-transformed-similar-svg11-ref.png	\
	meta-surface-pattern-ref.png		\
	meta-surface-pattern-rgb24-ref.png	\
	meta-surface-pattern-pdf-ref.png	\
	meta-surface-pattern-pdf-rgb24-ref.png	\
	meta-surface-pattern-ps2-argb32-ref.png	\
	meta-surface-pattern-ps2-rgb24-ref.png	\
	meta-surface-pattern-ps3-argb32-ref.png	\
	meta-surface-pattern-ps3-rgb24-ref.png	\
	meta-surface-pattern-quartz-ref.png	\
	meta-surface-pattern-quartz-rgb24-ref.png	\
	meta-surface-pattern-svg11-argb32-ref.png	\
	meta-surface-pattern-svg11-rgb24-ref.png	\
	meta-surface-pattern-svg12-argb32-ref.png	\
	meta-surface-pattern-svg12-rgb24-ref.png	\
	miter-precision-ref.png \
	miter-precision-ps2-ref.png	\
	miter-precision-ps3-ref.png	\
	move-to-show-surface-ref.png	\
	new-sub-path-ps2-argb32-ref.png	\
	new-sub-path-ps3-argb32-ref.png	\
	new-sub-path-ps2-rgb24-ref.png	\
	new-sub-path-ps3-rgb24-ref.png	\
	new-sub-path-quartz-ref.png	\
	new-sub-path-quartz-rgb24-ref.png	\
	new-sub-path-ref.png	\
	new-sub-path-rgb24-ref.png	\
	nil-surface-ref.png	\
	nil-surface-rgb24-ref.png	\
	operator-ref.png	\
	operator-rgb24-ref.png	\
	operator-alpha-ref.png	\
	operator-alpha-rgb24-ref.png	\
	operator-clear-quartz-ref.png	\
	operator-clear-quartz-rgb24-ref.png	\
	operator-clear-ref.png	\
	operator-clear-rgb24-ref.png	\
	operator-clear-pdf-argb32-ref.png	\
	operator-clear-pdf-rgb24-ref.png	\
	operator-source-pdf-argb32-ref.png	\
	operator-source-pdf-rgb24-ref.png	\
	operator-source-ref.png	\
	operator-source-rgb24-ref.png	\
	operator-source-quartz-ref.png \
	operator-source-quartz-rgb24-ref.png \
	over-above-source-ps2-argb32-ref.png       \
	over-above-source-ps3-argb32-ref.png       \
	over-above-source-quartz-ref.png	  \
	over-above-source-quartz-rgb24-ref.png	  \
	over-above-source-ref.png                 \
	over-above-source-rgb24-ref.png           \
	over-around-source-ps2-argb32-ref.png       \
	over-around-source-ps3-argb32-ref.png       \
	over-around-source-ps2-rgb24-ref.png        \
	over-around-source-ps3-rgb24-ref.png        \
	over-around-source-quartz-ref.png	   \
	over-around-source-quartz-rgb24-ref.png	   \
	over-around-source-ref.png                 \
	over-around-source-rgb24-ref.png           \
	over-below-source-ps2-argb32-ref.png       \
	over-below-source-ps3-argb32-ref.png       \
	over-below-source-ref.png                 \
	over-below-source-rgb24-ref.png           \
	over-between-source-ps2-argb32-ref.png     \
	over-between-source-ps3-argb32-ref.png     \
	over-between-source-quartz-ref.png        \
	over-between-source-quartz-rgb24-ref.png  \
	over-between-source-ref.png                 \
	over-between-source-rgb24-ref.png           \
	paint-ref.png	\
	paint-repeat-ref.png	\
	paint-source-alpha-pdf-argb32-ref.png	\
	paint-source-alpha-ref.png	\
	paint-source-alpha-svg12-ref.png	\
	paint-source-alpha-svg11-ref.png	\
	paint-with-alpha-ref.png	\
	paint-with-alpha-svg12-ref.png	\
	paint-with-alpha-svg11-ref.png	\
	paint-source-alpha-pdf-ref.png \
	paint-with-alpha-pdf-ref.png \
	pass-through-ref.png \
	pass-through-rgb24-ref.png \
	pattern-getters-ref.png	\
	pdf-surface-source-ref.png \
	pixman-rotate-ref.png	\
	pixman-rotate-rgb24-ref.png	\
	ps-surface-source-ref.png \
	push-group-pdf-ref.png \
	push-group-pdf-rgb24-ref.png \
	push-group-ref.png	\
	push-group-rgb24-ref.png	\
	push-group-svg11-argb32-ref.png	\
	push-group-svg12-argb32-ref.png	\
	radial-gradient-ref.png	\
	radial-gradient-pdf-ref.png \
	radial-gradient-quartz-ref.png \
	radial-gradient-svg12-ref.png	\
	radial-gradient-svg11-ref.png	\
	random-intersections-ref.png	\
	random-intersections-ps2-ref.png \
	random-intersections-ps3-ref.png \
	random-intersections-quartz-ref.png \
	rgb24-ignore-alpha-ref.png \
	rectangle-rounding-error-ref.png	\
	rectilinear-fill-ref.png	\
	rectilinear-miter-limit-ref.png		\
	rectilinear-miter-limit-ps2-ref.png	\
	rectilinear-miter-limit-ps3-ref.png	\
	rectilinear-stroke-ref.png	\
	reflected-stroke-ref.png	\
	reflected-stroke-ps2-ref.png	\
	reflected-stroke-ps3-ref.png	\
	reflected-stroke-quartz-ref.png	\
	rel-path-quartz-ref.png	\
	rel-path-quartz-rgb24-ref.png	\
	rel-path-ps2-rgb24-ref.png	\
	rel-path-ps3-rgb24-ref.png	\
	rel-path-ref.png	\
	rel-path-rgb24-ref.png	\
	rotate-image-surface-paint-pdf-rgb24-ref.png \
	rotate-image-surface-paint-ps2-ref.png \
	rotate-image-surface-paint-ps3-ref.png \
	rotate-image-surface-paint-pdf-argb32-ref.png	\
	rotate-image-surface-paint-quartz-ref.png	\
	rotate-image-surface-paint-ref.png	\
	rotate-image-surface-paint-svg12-ref.png	\
	rotate-image-surface-paint-svg11-ref.png	\
	scale-down-source-surface-paint-ref.png	\
	scale-source-surface-paint-pdf-argb32-ref.png	\
	scale-source-surface-paint-ref.png	\
	scale-source-surface-paint-rgb24-ref.png	\
	scale-source-surface-paint-svg11-argb32-ref.png	\
	scale-source-surface-paint-svg11-rgb24-ref.png	\
	scale-source-surface-paint-svg12-argb32-ref.png	\
	scale-source-surface-paint-svg12-rgb24-ref.png	\
	scale-source-surface-paint-pdf-rgb24-ref.png \
	stroke-ctm-caps-ref.png \
	stroke-ctm-caps-quartz-ref.png \
	select-font-face-ref.png	\
	select-font-face-ps2-ref.png \
	select-font-face-ps3-ref.png \
	select-font-face-quartz-ref.png \
	self-copy-ref.png	\
	self-copy-ps2-ref.png	\
	self-copy-ps3-ref.png	\
	self-copy-overlap-ref.png	\
	self-copy-overlap-rgb24-ref.png	\
	self-intersecting-ref.png	\
	self-intersecting-rgb24-ref.png	\
	set-source-ref.png	\
	set-source-rgb24-ref.png	\
	set-source-svg11-argb32-ref.png	\
	set-source-svg12-argb32-ref.png	\
	show-glyphs-many-ref.png	\
	show-text-current-point-ref.png	\
	show-text-current-point-ps2-ref.png \
	show-text-current-point-ps3-ref.png \
	show-text-current-point-quartz-ref.png \
	skew-extreme-ref.png \
	skew-extreme-ps2-ref.png \
	skew-extreme-ps3-ref.png \
	smask-ref.png			\
	smask-pdf-ref.png		\
	smask-ps2-ref.png		\
	smask-ps3-ref.png		\
	smask-svg12-ref.png		\
	smask-svg11-ref.png		\
	smask-xlib-ref.png		\
	smask-xlib-fallback-ref.png		\
	smask-fill-ref.png		\
	smask-fill-pdf-ref.png		\
	smask-fill-svg12-ref.png	\
	smask-fill-svg11-ref.png	\
	smask-image-mask-ref.png	\
	smask-image-mask-pdf-ref.png	\
	smask-mask-ref.png		\
	smask-mask-pdf-ref.png		\
	smask-mask-svg12-ref.png	\
	smask-mask-svg11-ref.png	\
	smask-paint-ref.png		\
	smask-paint-pdf-ref.png		\
	smask-paint-svg12-ref.png	\
	smask-paint-svg11-ref.png	\
	smask-stroke-ref.png		\
	smask-stroke-pdf-ref.png	\
	smask-text-ref.png		\
	smask-text-pdf-ref.png		\
	smask-text-ps2-ref.png		\
	smask-text-ps3-ref.png		\
	smask-text-svg12-ref.png	\
	smask-text-svg11-ref.png	\
	smask-text-xlib-ref.png		\
	smask-text-xlib-fallback-ref.png		\
	stroke-image-ref.png \
	stroke-image-pdf-ref.png \
	stroke-image-ps2-ref.png \
	stroke-image-ps3-ref.png \
	stroke-image-quartz-ref.png \
	solid-pattern-cache-stress-ref.png	\
	source-clip-ref.png	\
	source-clip-scale-quartz-ref.png	\
	source-clip-scale-ps2-argb32-ref.png	\
	source-clip-scale-ps3-argb32-ref.png	\
	source-clip-scale-ps2-rgb24-ref.png	\
	source-clip-scale-ps3-rgb24-ref.png	\
	source-clip-scale-ref.png	\
	source-clip-scale-svg12-ref.png	\
	source-clip-scale-svg11-ref.png	\
	source-clip-scale-pdf-ref.png \
	source-surface-scale-paint-ref.png	\
	source-surface-scale-paint-rgb24-ref.png	\
	spline-decomposition-ref.png \
	spline-decomposition-ps2-ref.png \
	spline-decomposition-ps3-ref.png \
	spline-decomposition-pdf-ref.png \
	spline-decomposition-svg11-ref.png \
	spline-decomposition-svg12-ref.png \
	stroke-ctm-caps-ps2-ref.png \
	stroke-ctm-caps-ps3-ref.png \
	surface-pattern-big-scale-down-ref.png	\
	surface-pattern-pdf-argb32-ref.png	\
	surface-pattern-ps2-argb32-ref.png	\
	surface-pattern-ps3-argb32-ref.png	\
	surface-pattern-ref.png	\
	surface-pattern-scale-down-pdf-argb32-ref.png	\
	surface-pattern-scale-down-ps2-argb32-ref.png	\
	surface-pattern-scale-down-ps3-argb32-ref.png	\
	surface-pattern-scale-down-ref.png	\
	surface-pattern-scale-down-quartz-ref.png	\
	surface-pattern-scale-up-pdf-argb32-ref.png	\
	surface-pattern-scale-up-ps2-argb32-ref.png	\
	surface-pattern-scale-up-ps3-argb32-ref.png	\
	surface-pattern-scale-up-ref.png	\
	surface-pattern-svg12-ref.png	\
	surface-pattern-svg11-ref.png	\
	svg-surface-source-ref.png \
	text-antialias-gray-ref.png	\
	text-antialias-gray-quartz-ref.png	\
	text-antialias-none-ref.png	\
	text-antialias-none-quartz-ref.png	\
	text-antialias-subpixel-ref.png	\
	text-antialias-subpixel-quartz-ref.png	\
	text-glyph-range-ref.png	\
	text-glyph-range-rgb24-ref.png	\
	text-pattern-ps3-argb32-ref.png	\
	text-pattern-ps3-rgb24-ref.png	\
	text-pattern-ref.png	\
	text-pattern-rgb24-ref.png	\
	text-pattern-svg11-argb32-ref.png	\
	text-pattern-svg11-rgb24-ref.png	\
	text-pattern-svg12-argb32-ref.png	\
	text-pattern-svg12-rgb24-ref.png	\
	text-pattern-pdf-argb32-ref.png \
	text-pattern-pdf-rgb24-ref.png \
	text-pattern-quartz-ref.png \
	text-pattern-quartz-rgb24-ref.png \
	text-rotate-ref.png	\
	text-rotate-pdf-ref.png \
	text-rotate-ps2-ref.png	\
	text-rotate-ps3-ref.png	\
	text-rotate-svg12-ref.png \
	text-rotate-svg11-ref.png \
	text-rotate-quartz-ref.png \
	text-transform-ref.png		\
	text-transform-pdf-ref.png	\
	text-transform-ps2-ref.png	\
	text-transform-ps3-ref.png	\
	transforms-ref.png	\
	transforms-ps2-ref.png	\
	transforms-ps3-ref.png	\
	translate-show-surface-ref.png	\
	trap-clip-quartz-ref.png	\
	trap-clip-quartz-rgb24-ref.png	\
	trap-clip-ps3-argb32-ref.png	\
	trap-clip-ps3-rgb24-ref.png	\
	trap-clip-ref.png	\
	trap-clip-rgb24-ref.png	\
	trap-clip-pdf-argb32-ref.png \
	trap-clip-pdf-rgb24-ref.png \
	trap-clip-ps2-argb32-ref.png \
	trap-clip-ps2-rgb24-ref.png \
	unantialiased-shapes-ref.png	\
	unantialiased-shapes-quartz-ref.png \
	unbounded-operator-ref.png	\
	unbounded-operator-rgb24-ref.png	\
	user-font-ref.png	\
	user-font-ps2-ref.png \
	user-font-ps3-ref.png \
	user-font-svg12-ref.png	\
	user-font-svg11-ref.png	\
	user-font-mask-ref.png		\
	user-font-mask-pdf-ref.png	\
	user-font-mask-ps2-ref.png	\
	user-font-mask-ps3-ref.png	\
	user-font-mask-svg11-ref.png	\
	user-font-proxy-ref.png	\
	user-font-proxy-pdf-ref.png	\
	user-font-proxy-ps2-ref.png	\
	user-font-proxy-ps3-ref.png	\
	user-font-proxy-svg12-ref.png	\
	user-font-proxy-svg11-ref.png	\
	user-font-rescale-ref.png	\
	user-font-rescale-ps2-ref.png	\
	user-font-rescale-ps3-ref.png	\
	user-font-rescale-svg12-ref.png	\
	user-font-rescale-svg11-ref.png	\
	unbounded-operator-quartz-ref.png	\
	unbounded-operator-quartz-rgb24-ref.png	\
	xlib-expose-event-ref.png \
	xlib-surface-source-ref.png \
	zero-alpha-ref.png

EXTRA_DIST +=		\
6x13.pcf		\
make-html.pl		\
romedalen.png		\
surface-source.c	\
$(REFERENCE_IMAGES)

# Any test for which the code committed to CVS is expected to fail
# should be listed here.
#
# This way, we can avoid being bothered by reports of bugs we are
# aware of, but users can still report when tests start behaving in
# unexpected ways on their system.
#
# Of course, before any "release" of cairo we should eliminate
# everything from this list by fixing the bugs. (We don't necessarily
# have to be that strict for "snapshots" though.)
#
# Analysis of XFAIL errors:
# alpha-similar         - discrepancy between backends in applying color
#                         components of a pure alpha surface
# big-line              - range overflow of fixed-point
# big-trap              - range overflow of fixed-point
# degenerate-dash       - needs path editing in PS to convert degenerate
#                         end-caps into the shapes as expected by cairo
#                         (Or maybe PS is the correct behaviour?)
# degenerate-path       - undefined behaviour in PS, needs path editing to
#                         convert degenerate segments into circles/rectangles
#                         as expected by cairo
# device-offset-scale   - complication of pre-multiplying device_offset
#                         into the pattern_matrix and then requiring futher
#                         manipulation for SVG
# extend-pad            - lacks implementation in pixman and consequently used
#                         as an excuse for lack of support in other backends
# fallback-resolution   - The essential problem here is that the meta-surface
#                         has recorded a sequence of operations with one device
#                         transformation, and we attempt to replay it with
#                         another (basically a scale-factor for the falback
#                         resolution). Carl begun to look at this with his
#                         chain-of-bugs, but the can of worms is much bigger.
#                         It appears to be a design flaw in the meta-surface
#                         that may spread further...
#                         My solution would be to lock Behad and Adrian in a
#                         room, with Carl as a moderator and not let them out
#                         until they have come up with an interface and
#                         semantics that actually work. :-)
# long-lines            - range overflow of fixed-point
# self-copy-overlap     - vector surfaces take snapshot of patterns in contrast
#                         to the raster backends which don't. One solution
#                         would be to clone overlapping areas of dst/source, so
#                         patterns were effectively snapshotted across all
#                         backends.
# self-intersecting     - incremental trapezoidation of strokes can generate
#                         overlapping traps. Needs self-intersection analysis
#                         on cairo_traps_t after strokes.
#                         Test case should also be expanded to hit special-case
#                         tessellators as well.
# surface-pattern*      - old bugs in pixman, but fails PS/PDF due to lack of
#                         /Interpolate support - which causes a half-pixel
#                         shift in GS (and consequently virtually every
#                         image/fallback-image using test to FAIL).
XFAIL_TESTS =					\
alpha-similar$(EXEEXT)				\
big-line$(EXEEXT)				\
big-trap$(EXEEXT)				\
degenerate-dash$(EXEEXT)			\
degenerate-path$(EXEEXT)			\
device-offset-scale$(EXEEXT)			\
extend-pad$(EXEEXT)				\
fallback-resolution$(EXEEXT)			\
long-lines$(EXEEXT)				\
self-copy-overlap$(EXEEXT)			\
self-intersecting$(EXEEXT)			\
surface-pattern$(EXEEXT)			\
surface-pattern-big-scale-down$(EXEEXT)		\
surface-pattern-scale-down$(EXEEXT)		\
surface-pattern-scale-up$(EXEEXT)		\
$(NULL)

# Any test that doesn't generate a log file goes here
NOLOG_TESTS =			\
fallback-resolution		\
font-options			\
multi-page			\
pdf-features			\
png				\
ps-features			\
svg-clip			\
svg-surface			\
toy-font-face			\
user-data

# A hook that summarises the failures
# We need to both force make to keep going after failures and to disable the
# jobserver (parallel builds).
check: AM_MAKEFLAGS+=-k -j1
check-local:
	@FAILED_TESTS=""; \
	for t in $(TESTS:$(EXEEXT)=.log); do \
	    if grep -e '\<FAIL\>' $$t >/dev/null 2>&1; then \
		FAILED_TESTS="$$FAILED_TESTS $${t%.log}"; \
	    fi; \
	done; \
	if test -n "$$FAILED_TESTS"; then \
	    echo "Failed tests:"; \
	    surfaces=""; \
	    for t in $$FAILED_TESTS; do \
		echo -n "     $$t: "; \
		grep -e '\<FAIL\>' $$t.log | sed -e 's/.*TARGET: \([^ ]*\).*/\1/' | sort | uniq | tr '\n' ' '; \
		echo; \
		for s in `grep -e '\<FAIL\>' $$t.log | sed -e 's/.*TARGET: \([^ ]*\).*/\1/' | sort | uniq`; do \
		    ss=`echo $$s | tr '-' '_'`; \
		    tt=`echo $$t | tr '-' '_'`; \
		    eval $$ss=\""$${!ss} $$tt"\"; \
		    echo $$surfaces | grep $$ss >/dev/null || surfaces="$$surfaces $$ss"; \
		done; \
	    done; \
	    echo -n "Failures per surface - "; \
	    first=""; \
	    for s in $$surfaces; do \
	        ss=`echo $$s | tr '_' '-'`; \
		test -n "$$first" && echo -n ", "; \
		cnt=`echo $${!s} | wc -w`; \
	        echo -n "$$ss: $$cnt"; \
		first="false"; \
	    done; \
	    echo "."; \
	    for s in $$surfaces; do \
	        ss=`echo $$s | tr '_' '-'`; \
		cnt=`echo $${!s} | wc -w`; \
	        echo -n "	$$ss [$$cnt]: "; \
		echo $${!s} | tr '_' '-'; \
	    done; \
	fi

AM_CPPFLAGS =					\
	-I$(srcdir)				\
	-I$(srcdir)/pdiff			\
	-I$(top_srcdir)/boilerplate		\
	-I$(top_srcdir)/src			\
	-I$(top_builddir)/src			\
	$(CAIRO_CFLAGS)

EXTRA_LTLIBRARIES += libcairotest.la

libcairotest_la_SOURCES =\
	buffer-diff.c	\
	buffer-diff.h	\
	cairo-test.c	\
	cairo-test.h
libcairotest_la_LIBADD =\
	$(top_builddir)/test/pdiff/libpdiff.la \
        $(top_builddir)/boilerplate/libcairoboilerplate.la \
	$(top_builddir)/src/libcairo.la \
	$(CAIRO_LDADD)

LDADD = $(CAIRO_LDADD) libcairotest.la

$(top_builddir)/boilerplate/libcairoboilerplate.la: $(top_builddir)/src/libcairo.la
	cd $(top_builddir)/boilerplate && $(MAKE) $(AM_MAKEFLAGS) libcairoboilerplate.la

$(top_builddir)/src/libcairo.la:
	cd $(top_builddir)/src && $(MAKE) $(AM_MAKEFLAGS) libcairo.la

$(top_builddir)/test/pdiff/libpdiff.la:
	cd $(top_builddir)/test/pdiff && $(MAKE) $(AM_MAKEFLAGS) libpdiff.la

if HAVE_PTHREAD
LDADD += -lpthread
endif

check_PROGRAMS += imagediff png-flatten

if BUILD_ANY2PPM
check_PROGRAMS += any2ppm
any2ppm_CFLAGS = $(POPPLER_CFLAGS) $(LIBRSVG_CFLAGS) $(LIBSPECTRE_CFLAGS)
# add LDADD, so poppler/librsvg uses "our" cairo
any2ppm_LDFLAGS = $(CAIRO_TEST_UNDEFINED_LDFLAGS)
any2ppm_LDADD  = $(LDADD) $(POPPLER_LIBS) $(LIBRSVG_LIBS) $(LIBSPECTRE_LIBS)
endif

if CAIRO_CAN_TEST_PDF_SURFACE
check_PROGRAMS += pdf2png
pdf2png_CFLAGS = $(POPPLER_CFLAGS)
# add LDADD, so poppler uses "our" cairo
pdf2png_LDFLAGS = $(CAIRO_TEST_UNDEFINED_LDFLAGS)
pdf2png_LDADD  = $(LDADD) $(POPPLER_LIBS)
endif

if CAIRO_CAN_TEST_SVG_SURFACE
check_PROGRAMS += svg2png
svg2png_CFLAGS = $(LIBRSVG_CFLAGS)
# add LDADD, so librsvg uses "our" cairo
svg2png_LDFLAGS = $(CAIRO_TEST_UNDEFINED_LDFLAGS)
svg2png_LDADD  = $(LDADD) $(LIBRSVG_LIBS)
endif

if CAIRO_HAS_SPECTRE
check_PROGRAMS += ps2png
ps2png_CFLAGS = $(LIBSPECTRE_CFLAGS)
# add LDADD, so ps2png uses "our" cairo
ps2png_LDFLAGS = $(CAIRO_TEST_UNDEFINED_LDFLAGS)
ps2png_LDADD  = $(LDADD) $(LIBSPECTRE_LIBS)
endif

EXTRA_PROGRAMS += $(TESTS) $(DISABLED_TESTS)

# Do a funny transition of CAIRO_TEST_TARGET through TARGETS such that
# one can limit tested targets both through CAIRO_TEST_TARGET env var
# and TARGETS make var on the command line.  Same for the rest.
TARGETS = $(CAIRO_TEST_TARGET)
TARGETS_EXCLUDE = $(CAIRO_TEST_TARGET_EXCLUDE)
NUM_THREADS = $(CAIRO_TEST_NUM_THREADS)

# Same about ENV vs CAIRO_TEST_ENV.  ENV is used with "make run" only
ENV = $(CAIRO_TEST_ENV)

TESTS_ENVIRONMENT = CAIRO_XFAIL_TESTS="$(XFAIL_TESTS:$(EXEEXT)=)" CAIRO_TEST_TARGET="$(TARGETS)" CAIRO_TEST_TARGET_EXCLUDE="$(TARGETS_EXCLUDE)" CAIRO_TEST_NUM_THREADS="$(NUM_THREADS)" $(ENV)

EXTRA_VALGRIND_FLAGS = $(CAIRO_EXTRA_VALGRIND_FLAGS)
VALGRIND_FLAGS = \
	--tool=memcheck --suppressions=$(srcdir)/.valgrind-suppressions \
	--leak-check=yes --show-reachable=yes $(EXTRA_VALGRIND_FLAGS)

CLEANFILES +=					\
	valgrind-log				\
	index.html				\
	ref.hash				\
	png-test.png				\
	create-for-stream.pdf			\
	create-for-stream.ps			\
	create-for-stream.svg			\
	svg-surface-source.svg			\
	pdf-surface-source.pdf			\
	ps-surface-source.ps			\
	pdf-features.pdf			\
	ps-features.ps				\
	svg-clip.svg				\
	svg-surface.svg				\
	multi-page.pdf				\
	multi-page.ps				\
	$(NULL)

# This used to be a simple 'echo ${RM} *.ps *.pdf *.svg *.etc', but
# most systems cannot handle all of our clean files together.
# Then it became a fancy find using many GNU extensions, but then the ugly
# reality of portability was raised and it became....
clean-local: clean-caches
	-${FIND} . -name '*-out.*'    -print | ${XARGS} ${RM}
	-${FIND} . -name '*-diff.png' -print | ${XARGS} ${RM}
	-${FIND} . -name '*.log'      -print | ${XARGS} ${RM}
	-${FIND} . -name '*.[is]'     -print | ${XARGS} ${RM}
clean-caches:
	-${FIND} . -name '*-pass.*'   -print | ${XARGS} ${RM}
	-${FIND} . -name '*-fail.*'   -print | ${XARGS} ${RM}

# The following definitions both should work.
#FAILED_TESTS = `grep -l '\<FAIL\>' $(TESTS:$(EXEEXT)=.log) 2>/dev/null | sed -e 's/[.]log$$//' | xargs echo`
FAILED_TESTS = `grep -l '\<FAIL\>' $(TESTS:$(EXEEXT)=.log) 2>/dev/null | tr '\n' ' ' | sed -e 's/[.]log  */ /g; s/^ //; s/ $$//'`

recheck = check TESTS="$(FAILED_TESTS)"

# Re-checks all failed tests, i.e. tests with a log file that has a failure
recheck:
	@echo Re-checking failed tests
	@$(MAKE) $(AM_MAKEFLAGS) $(recheck)

# Checks tests and creates index.html.
# Target doesn't fail if tests fail.
test:
	@$(MAKE) $(AM_MAKEFLAGS) check; \
	$(MAKE) $(AM_MAKEFLAGS) html

# Re-checks tests and creates index.html.
# Target doesn't fail if tests fail.
retest:
	@TESTS="$(FAILED_TESTS)"; \
	$(MAKE) $(AM_MAKEFLAGS) TESTS="$$TESTS" check; \
	$(MAKE) $(AM_MAKEFLAGS) TESTS="$$TESTS" html

# Make index.html with no dependency tracking.
html-local:
	@echo Creating index.html
	@perl $(srcdir)/make-html.pl $(TESTS:$(EXEEXT)=.log) > index.html

# Make index.html with no dependency tracking, containing only the failed tests.
rehtml:
	@$(MAKE) $(AM_MAKEFLAGS) TESTS="$(FAILED_TESTS)" html

# Run tests under a tool specified by TOOL.  For example, make run TOOL=gdb
run:
	$(MAKE) $(AM_MAKEFLAGS) check TESTS_ENVIRONMENT='$(TESTS_ENVIRONMENT) $(top_builddir)/libtool --mode=execute env $(TOOL)'

# Check tests under valgrind.  Saves log to valgrind-log
check-valgrind:
	$(MAKE) $(AM_MAKEFLAGS) check TESTS_ENVIRONMENT='$(TESTS_ENVIRONMENT) $(top_builddir)/libtool --mode=execute valgrind $(VALGRIND_FLAGS)' 2>&1 | tee valgrind-log


$(TESTS): $(check_PROGRAMS)

%.log: % $(check_PROGRAMS)
	-./$<

NOLOG_TESTS_LOG = $(NOLOG_TESTS:=.log)

$(NOLOG_TESTS_LOG):
	@echo dummy > $@

index.html: $(srcdir)/make-html.pl $(TESTS:$(EXEEXT)=.log)
	@echo Creating index.html
	@perl $^ > $@


# Identify identical reference images
check-ref-dups:
	@LANG=C; \
	( cd "$(scrdir)" && sha1sum *-ref.png | sort ) > ref.hash; \
	join ref.hash ref.hash | grep -v -E '( .*-ref.png).*\1' | cut -d' ' -f 1-2 | sort -u

# Not exactly the best script in the world...
check-ref-missing:
	@cd "$(srcdir)"; \
	REFS=`git ls-files "*-ref.png"`; \
	test x = "x$$REFS" && REFS=`ls *-ref.png`; \
	ret=true; \
	missing=""; \
	for i in $$REFS; do \
	    echo "" $(REFERENCE_IMAGES) "" | grep -sq " $$i " || missing="$$missing $$i" ; \
	done ; \
	if test -n "$$missing"; then \
		echo "*** Error: Sanity check failed"; \
		echo "Some reference files are not included in the distribution."; \
		echo "You probably need to add these to Makefile.am's REFERENCE_IMAGES."; \
		echo "Missing: $$missing"; \
		ret=false; \
	fi >&2; \
	missing=""; \
	for i in $(REFERENCE_IMAGES); do \
	    echo "" $$REFS "" | grep -sq " $$i " || missing="$$missing $$i" ; \
	done ; \
	if test -n "$$missing"; then \
		echo "*** Error: Sanity check failed"; \
		echo "Some reference files included in the distribution do not exist"; \
		echo "or are not in git.  You probably want to add these to git first."; \
		echo "Missing: $$missing"; \
		ret=false; \
	fi >&2; \
	$$ret

release-verify-sane-tests: check-ref-missing

.PHONY: check-valgrind test recheck retest rehtml check-ref-dups check-ref-missing release-verify-sane-tests

EXTRA_DIST += Makefile.win32
